import { useEffect } from 'react';
import WS from '../utils/websocket';
import WEBSOCKET_TYPES from '../utils/WEBSOCKET_TYPES';

const wsInstanceMap = new Map(); // websocket 实例,同roomId使用同一个实例
// let pageCounter = 0; // 统计使用本 hook 的活跃页面数目，如果 === 0，则中断 socket 连接

/**
 * 单例版本，所有调用本函数者，均会共享同一个websocket实例，共享同一条websocket连接！
 * 面试准备页面、面试记录页面专用
 * @param {*} userCode 用户标识
 * @param {*} roomId 房号😄，同roomId即可互相广播
 * @param {*} event 订阅的事件，例如 jms.topic.interview111，
 * @param {*} msgAfterInit 初始化后需要发送的报文，
 * 录音的场景比较特殊,所有事件均需要广播。
 * 所以只订阅一个事件,具体的事件用报文 body 的 type 属性进行区分。
 */
const useSharedSocket = (userCode, roomId, event, eventHandler, msgAfterInit) => {
    // 初始化、断开逻辑在此
    useEffect(() => {
        let wsInstance = null;
        if (!wsInstanceMap.get(roomId)) {
            console.log('socket 单例版本 --- 创建');
            wsInstance = new WS(userCode, roomId, event);
            wsInstance.connect();
            wsInstanceMap.set(roomId, {
                instance: wsInstance,
                pageCounter: 1
            });
        } else {
            const mapVal = wsInstanceMap.get(roomId);
            console.log('=======================mapVal========================>', mapVal);
            let { pageCounter } = mapVal;
            wsInstance = mapVal.instance;
            console.log('socket 单例版本 --- 已拥有单例');
            pageCounter += 1;
            wsInstanceMap.set(roomId, {
                ...mapVal,
                pageCounter
            });
        }

        // 处理事件监听
        wsInstance.subscribe(event, res => {
            eventHandler(res);
        });

        if (msgAfterInit) {
            wsInstance.send(msgAfterInit);
        }

        return () => {
            const mapVal = wsInstanceMap.get(roomId);
            let { pageCounter } = mapVal;
            pageCounter -= 1;
            wsInstanceMap.set(roomId, {
                ...mapVal,
                pageCounter
            });
            if (pageCounter <= 0) {
                console.log('socket 单例版本 --- 销毁');
                wsInstance.disconnect();
                wsInstance = null;
                wsInstanceMap.delete(roomId); // 销毁Map中的引用
            } else {
                console.log('socket 单例版本 --- 仍有页面使用');
            }
        };
    }, []);

    /**
     * 通过面试准备页、面试记录页共享的 websocket 发送报文，仅用于触发自定义问题更新
     * @param {boolean} isRECPage 是否为面试记录页面。当isRECPage === true, 则面试记录页面收到此事件时，无需更新自定义问题，因为ADD_QUESTION事件已触发了更新。
     */
    const sendUpdateQuestionMsg = isRECPage => {
        const { instance: wsInstance } = wsInstanceMap.get(roomId);
        const msg = {
            type: WEBSOCKET_TYPES.SHARED_UPDATE_QUESTION,
            data: {
                isRECPage,
                userCode
            }
        };
        wsInstance.send(msg);
    };

    return [sendUpdateQuestionMsg];
};

export default useSharedSocket;
